package com.Day6.myhotel;


import java.util.Scanner;

/**
 * Copyright (C), 2018-2021, 若若叶
 * Author: Hx162
 * Date: 2021/7/13 13:59
 * FileName: MyHotel
 * Description: 模拟酒店房间及入住的情况
 */


public class MyHotel {

    /**
     * 动态创建一个Room对象的二维数组
     */
    static Room[][] hotel = new Room[5][9];

    /**
     * 酒店5层：1层餐厅，2层单人间，3层双人间，4层豪华间，5层总统套房（只有一间）
     */
    public static void init() {
        for (int i = 0; i < hotel[0].length; i++) {
            hotel[0][i] = new Room(101 + i, "餐厅", true);
        }
        for (int i = 0; i < hotel[1].length; i++) {
            hotel[1][i] = new Room(201 + i, "单人间", true);
        }
        for (int i = 0; i < hotel[2].length; i++) {
            hotel[2][i] = new Room(301 + i, "双人间", true);
        }
        for (int i = 0; i < hotel[3].length; i++) {
            hotel[3][i] = new Room(401 + i, "豪华间", true);
        }
        for (int i = 0; i < hotel[4].length; i++) {
            hotel[4][i] = new Room(501, "总统套房", true);
        }
    }

    /**
     * 预定方法
     * @param id 房间号
     */
    public static void order(int id) {
        if (id > 100 && id < 110 || id > 200 && id < 210 || id > 300 && id < 310 || id > 400 && id < 410 || id > 500 && id < 510) {
            //获得楼层数，间号码的首位
            int x = id / 100;
            //获得房间号码的后两位
            int y = id % 100;
            //查看是否已经预定
            if (hotel[x - 1][y - 1].getFree()) {
                System.out.println("您确定要预定" + x + "楼" + id + "号" + hotel[x - 1][y - 1].getType() + "吗？");
                //确认方法
                int c = confirm();
                if (c == 1) {
                    //总统套房只有一间，预定就全部处于被预定状态
                    //是否被预定属性赋值false
                    if (x == 5) {
                        for (int i = 0; i < hotel[4].length; i++) {
                            hotel[4][i].setFree(false);
                        }
                        System.out.println("您成功预定了总统套房。");
                    } else {
                        hotel[x - 1][y - 1].setFree(false);
                        System.out.println("您成功预定了" + x + "楼" + id + "号" + hotel[x - 1][y - 1].getType());
                    }
                }
            } else {
                System.out.println(x + "楼" + id + "号" + hotel[x - 1][y - 1].getType() + "已经被预定了。请选择其他房间把。");
            }
        } else {
            System.out.println("请输入正确的房间号。输入“0”退出");
            //调用输入方法
            int reid = inPut();
            if (reid == 0) {
                return;
            }
            //重新调用自己（递归？）
            order(reid);
        }
    }

    /**
     * 退订方法
     * @param id 房间号
     */
    public static void unsubscribe(int id) {
        if (id > 100 && id < 110 || id > 200 && id < 210 || id > 300 && id < 310 || id > 400 && id < 410 || id > 500 && id < 510) {
            //获得楼层数，间号码的首位
            int x = id / 100;
            //获得房间号码的后两位
            int y = id % 100;
            //查看是否已经预定
            if (!(hotel[x - 1][y - 1].getFree())) {
                System.out.println("您确定要退订" + x + "楼" + id + "号" + hotel[x - 1][y - 1].getType() + "吗？");

                int c = confirm();
                if (c == 1) {
                    //总统套房只有一间，预定就全部处于被预定状态
                    if (x == 5) {
                        for (int i = 0; i < hotel[4].length; i++) {
                            //是否被预定属性赋值true
                            hotel[4][i].setFree(true);
                        }
                        System.out.println("您成功退订了总统套房。");
                    } else {
                        //是否被预定属性赋值true
                        hotel[x - 1][y - 1].setFree(true);
                        System.out.println("您成功退订了" + x + "楼" + id + "号" + hotel[x - 1][y - 1].getType());
                    }
                }
            } else {
                System.out.println(x + "楼" + id + "号" + hotel[x - 1][y - 1].getType() + "未被预定，您是不是输入有误呢。");
            }
        } else {
            System.out.println("请输入正确的房间号。输入“0”退出");
            //调用输入方法
            int reid = inPut();
            if (reid == 0) {
                return;
            }
            //重新调用自己（递归？）
            order(reid);
        }
    }

    /**
     * 键入方法
     * @return 返回输入的值
     */
    public static int inPut() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }

    /**
     * 打印方法
     */
    public static void print() {
        //遍历hotel二维数组
        for (int i = hotel.length-1; i >= 0; i--) {
            System.out.println("第" + (i + 1) + " 楼：");
            for (int j = 0; j < hotel[i].length; j++) {
                //是否有人预定用以下方法
                String free = "未有人入住";
                if (!hotel[i][j].getFree()) {
                    free = "已有人入住";
                }
                System.out.print("  房间编号：" + hotel[i][j].getId() + "  房间类型：" + hotel[i][j].getType() + "  是否有人入住：" + free + "   ");
            }
            System.out.println();
        }
    }

    /**
     * 确认函数
     * @return  返回0：取消 1：确定
     */
    public static int confirm(){
        System.out.println("0:取消");
        System.out.println("1:确定");
        //调用输入函数
        int c = inPut();
        return c;
    }

    /**
     * 提示函数
     */
    public static void tips(){
        System.out.println("0：退出系统");
        System.out.println("1：预定");
        System.out.println("2：退定");
        System.out.println("3：查询房间入住状况");
    }

    public static void main(String[] args) {
        //初始化数组并赋值
        init();
        //开关K 1：运行状态  0：结束
        int k = 1;
        while (k == 1) {
            System.out.println("您想预定房间还是退订房间？");
            //调用提示方法提示功能
            tips();
            //调用键入方法
            int m = inPut();
            if (m == 0) {
                System.out.println("您确定退出系统吗？");
                //调用确认方法
                int c = confirm();
                if (c == 1) {
                    k = 0;
                }
            } else if (m == 1) {
                System.out.println("请输入您要预定的房间号：");
                //调用键入方法并把值传给预定方法
                order(inPut());
            } else if (m == 2) {
                System.out.println("请输入您要退订的房间号：");
                //调用键入方法并把值传给退订方法
                unsubscribe(inPut());
            }else if (m==3){
                //遍历数组
                print();
            }else {
                System.out.println("请输入正确的数字。");
            }
        }
        System.out.println("感谢您的使用。");
    }
}
